# utils/plot_function.py
import numpy as np
import matplotlib.pyplot as plt

# 绘制给定函数在指定范围内的图形。
# vectorized要求f是lambda函数，single对f没有要求
def plot_function_vectorized(f, x_range):
    """
    参数:
    - f: 一个函数，它接受一组浮点数并返回一组浮点数。
    - x_range: 一个元组，指定绘图的x轴范围 (start, end)。
    """
    x = np.linspace(x_range[0], x_range[1], 400)
    y = f(x)
    # 获取函数名并将其用作图表的标题
    function_name = f.__name__
    plt.plot(x, y, label=f"{function_name} plot from {x_range[0]} to {x_range[1]}")
    plt.xlabel('x')
    plt.ylabel('f(x)')
    plt.title(f'{function_name}')
    plt.legend()
    plt.grid(True)
    plt.show()


def plot_function_single(f, x_range):
    """
    绘制指定函数的图像。
    参数:
    - f: 一个函数，它接受一个浮点数并返回一个浮点数。
    - x_range: 一个元组，指定绘图的x轴范围 (start, end)。
    """
    # 生成x值数组
    x = np.linspace(x_range[0], x_range[1], 400)
    # 对每个x值计算f(x)，使用列表推导式逐一调用f
    y = [f(xi) for xi in x]  # 这里改为逐个调用f

    # 获取函数名并将其用作图表的标题
    function_name = f.__name__
    # 绘制函数图形
    plt.plot(x, y, label=f"{function_name} plot from {x_range[0]} to {x_range[1]}")
    plt.xlabel('x')
    plt.ylabel('f(x)')
    plt.title(f'{function_name}')
    plt.legend()
    plt.grid(True)
    plt.show()